﻿/**
 *
 * @file   FITKCCXAdaptorModel.h
 * @brief  Calculix model适配器，用于解析abaqus的inp文件中的Instance,Assembly中的node、element、set、surface集合
 * @author XuChao (xxu715737@163.com)
 * @date   2024-05-31
 *
 */
#ifndef FITKCCXADAPTORMODEL_H
#define FITKCCXADAPTORMODEL_H
#include "FITKCCXAbstractAdaptor.h"
#include "FITKCCXModelInforManager.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

// 前置声明
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKModelSet)
ForwardDeclarNS(Interface, FITKMeshSurface)
ForwardDeclarNS(AbaqusData, FITKDataCase)

namespace IO
{
    class FITKCCXAdaptorModel : public FITKCCXAbstractAdaptor
    {
    public:
        explicit FITKCCXAdaptorModel() = default;
        ~FITKCCXAdaptorModel() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief  设置abaqus与calculix中的映射关系
         * @param  modelInfoManager
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setModelInfoManager(FITKCCXModelInforManager* modelInfoManager);

        /**
       * @brief 适配器读取
       * @return 状态 true成功， false失败
       * @author fulipeng (fulipengqd@yeah.net)
       * @date 2024-03-15
       */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool adaptW() override;

    private:

        /**
         * @brief  写出节点信息
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeNode();

        /**
         * @brief  写出instance中的节点信息
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeInstanceNode();

        /**
         * @brief  写出assembly中的节点信息
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeAssemblyNode();

        /**
         * @brief  写出单元信息
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeElement();

        /**
         * @brief  写出集合和表面
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeSetSurf();

        /**
         * @brief  写出Instance中的集合和表面
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeInstanceSetSurf();

        /**
         * @brief  写出assembly中的集合和表面
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeAssemblySetSurf();

        /**
         * @brief  写出set 包含点集、单元集
         * @param  set
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeSet(Interface::FITKModelSet* set, const int &mappingKeyDataObjectID);

        /**
         * @brief  写出surface
         * @param  surface
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeSurface(Interface::FITKMeshSurface* surface, const int &mappingKeyDataObjectID);

        /**
         * @brief  写出Section
         * @return 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-31
         */
        bool writeSection();

        /**
         * @brief 写出惯量
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date 2024-06-13
         */
        bool writeInertia();

        /** 
         * @brief  写出Part中的惯量 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-13
         */
        bool writeInstanceInertia();

        /** 
         * @brief  写出assembly中的惯量 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-13
         */
        bool writeAssemblyInertia();

        /**
         * @brief 写出 局部坐标系
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-13
         */
        bool writeTransformOrientation();

        /** 
         * @brief  写出Instance中的局部坐标系 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-13
         */
        bool writeInstanceOrientation();

        /** 
         * @brief  写出assembly中的局部坐标系 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-13
         */
        bool writeAssemblyTransform();

        /**
        * @brief  判断值是否为0
        * @param  d 数据
        * @param  size 数组长度
        * @return true 含有非零值 false 都为零
        * @author XuChao (xxu715737@163.com)
        * @date   2024-05-24
        */
        bool JudgeZero(double* d, int size);

    private:
        /**
         * @brief 算例数据
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
        * @brief 装配（Assembly）数据
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
        */
        Interface::FITKAbaAssembly* _assemblyData{};

        /**
         * @brief  abaqus与calculix映射关系表
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-28
         */
        FITKCCXModelInforManager *_modelInfoManager{};

        /**
         * @brief  节点编码累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _nodeNumber = 0;

        /**
         * @brief   单元编码累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _elementNumber = 0;

        /**
         * @brief  集合编码累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _setNumber = 0;

        /**
         * @brief  表面编码累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _surfaceNumber = 0;

    };
    Register2FITKIOAdaptorFactory(CCXINP, Interface::FITKAbaAssembly, FITKCCXAdaptorModel);
    
}
#endif // !FITKCCXADAPTORMODEL_H